package com.photoeditor.demo.ui.widget.image;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.view.animation.AnimationUtils;
import android.view.animation.Transformation;

import com.photoeditor.demo.model.image.tools.MatrixAnimation;


/**
 * 可旋转的图像视图
 * </br>
 * 本类也支持通过{@link MatrixAnimation}，使矩阵变换时能产生动画过渡效果。
 * 但仅支持通过{@link #setAnimationImageMatrix(Matrix)}设置，
 * 如果同时设置了缩放值和旋转值，则以这些为准，矩阵设置无效。</br>
 * </br>
 * <b>注意：旋转和缩放控件将不会对大小和位置产生变化！</b></br>
 * 若需要同时根据角度和缩放比例控制空间，请参考工具类TransformUtil
 */
public class RotatableImageView extends PhotoView {

    /**
     * 变形动画的持续时间（毫秒）
     */
    private static final long DURATION_MATRIX_ANIMATION = 250L;

    // 动画相关的变量
    private boolean mAnimationEnable = false;
    private boolean mIsAnimationRunning = false;
    private MatrixAnimation mMatrixAnimation = null;
    private Transformation mTransformation = null;

    public RotatableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public RotatableImageView(Context context) {
        super(context);
    }


    //	/**
//	 * 旋转并缩放该图像控件 <b>（将会立即刷新）</b>
//	 * @param degrees 旋转的角度
//	 * @param scale 缩放的倍数
//	 */
//	public void rotateAndScale(float degrees, float scale) {
//		mDegress = degrees;
//		mScale = scale;
//		invalidate();
//	}
//	
//	
//	/**
//	 * 旋转该图像控件 <b>（将会立即刷新）</b>
//	 * @param degrees 旋转的角度
// 	 */
//	public void rotate(float degrees) {
//		mDegress = degrees;
//		invalidate();
//	}
//	
//	/**
//	 * 获取当前的旋转角度
//	 * @return 当前的旋转角度
//	 */
//	public float getRotateDegree() {
//		return mDegress;
//	}
//	
//	
//	/**
//	 * 缩放该图像控件 <b>（将会立即刷新）</b>
//	 * @param scale 缩放的倍数
//	 */
//	public void scale(float scale) {
//		if(scale > 0) {
//			mScale = scale;
//			invalidate();
//		}
//	}
//	
//	/**
//	 * 获取当前缩放的倍数
//	 * @return 当前缩放的倍数
//	 */
//	public float getScaleTime() {
//		return mScale;
//	}
//	
//	
//	/**
//	 * 设置是否可以启用动画
//	 * @param enable 是否可以启用动画
//	 */
    public void setAnimationEnable(boolean enable) {
        mAnimationEnable = enable;
        if (enable && mTransformation == null) {
            mTransformation = new Transformation();
        }
    }

    //
//	/**
//	 * 是否可以启用动画
//	 * @return 是否可以启用动画
//	 */
    public boolean isAnimationEnable() {
        return mAnimationEnable;
    }

    /**
     * 使用动画模式设置矩阵对象，并实现平滑变换。设置后动画随即开始
     *
     * @param matrix 需要变换的目标矩阵对象
     */
    public void setAnimationImageMatrix(Matrix matrix) {
        if (mAnimationEnable) {
            mIsAnimationRunning = true;

            if (mMatrixAnimation == null) {
                mMatrixAnimation = new MatrixAnimation(getImageMatrix(), matrix);
                mMatrixAnimation.setDuration(DURATION_MATRIX_ANIMATION);
            }

            mMatrixAnimation.setFromMatrix(getImageMatrix());
            mMatrixAnimation.setToMatrix(matrix);
            mMatrixAnimation.start();

            invalidate();
        }
    }

    //    /**
//     * 当前是否正在进行动画
//     * @return 当前是否正在进行动画
//     */
    public boolean isAnimationRunning() {
        return mIsAnimationRunning;
    }


    @Override
    protected void onDraw(Canvas canvas) {
//		if(mDegress != 0f || mScale != 1f) {
//			canvas.save();
//			
//			canvas.rotate(mDegress, getWidth() / 2, getHeight() / 2);
//			canvas.scale(mScale, mScale, getWidth() / 2, getHeight() / 2);
//			
//			super.onDraw(canvas);
//			
//			canvas.restore();
//			
//		} else {
        super.onDraw(canvas);

        if (mAnimationEnable == true) {
            if (mMatrixAnimation != null && !mMatrixAnimation.hasEnded()) {
                // 如果动画还没结束，则获取当前变换过程的矩阵
                mMatrixAnimation.getTransformation(
                        AnimationUtils.currentAnimationTimeMillis(),
                        mTransformation);
                Matrix currMatrix = mTransformation.getMatrix();

                if (currMatrix.equals(getImageMatrix())) {
                    // 如果矩阵没有变化，可能是时间值间隔太短或动画刚刚开始，这时手动重绘
                    invalidate();
                } else {
                    // 设置当前的矩阵变换，设置后会重绘
                    setImageMatrix(mTransformation.getMatrix());
                }
            } else {
                // 动画已经结束播放了，重新修改状态值
                mIsAnimationRunning = false;
            }
        }
    }
//	}

}
